package model

import (
	"gin-vben-admin/internal/constant"
	"gorm.io/gorm"
	"strconv"
	"strings"
	"time"
)

type SysMenu struct {
	MenuId     int64  `json:"menu_id" gorm:"primaryKey;autoIncrement;comment:主键编码"`                          //菜单id
	ParentId   int64  `json:"parent_id" gorm:"column:parent_id;notNull;default:0;comment:父级id"`              //父id
	MenuName   string `json:"menu_name" gorm:"column:menu_name;size:100;notNull;comment:菜单名称"`               //菜单名称
	RouteName  string `json:"route_name"  gorm:"column:route_name;size:100;notNull;default:'';comment:路由名称"` //路由名称
	Icon       string `json:"icon"  gorm:"column:icon;size:100;notNull;default:'';comment:图标"`               //图标
	Path       string `json:"path" gorm:"column:path;size:255;notNull;default:'';comment:菜单路由路径"`            //菜单路由路径
	IdPath     string `json:"id_path" gorm:"column:id_path;size:255;notNull;default:'';comment:id路径"`        //id路径
	MenuType   int    `json:"menu_type" gorm:"column:menu_type;notNull;default:1;comment:类型"`                //菜单类型。1菜单2操作
	Component  string `json:"component" gorm:"column:component;size:255;notNull;default:'';comment:组件"`      //组件路径
	Visible    int    `json:"visible" gorm:"column:visible;notNull;default:1;comment:是否显示"`                  //是否可见1可见，2不可见
	IsFrame    int    `json:"is_frame" gorm:"column:is_frame;notNull;default:2;comment:是否外链"`                //是否外链，1是2否
	Permission string `json:"permission" gorm:"column:permission;size:100;notNull;default:'';comment:权限编码"`  //权限编码
	NoCache    int    `json:"no_cache" gorm:"column:no_cache;notNull;default:1;comment:是否缓存"`                //1不缓存2缓存

	Sort      int             `json:"sort" gorm:"column:sort;notNull;default:0;comment:排序，小到大"`        //排序
	Remark    string          `json:"remark" gorm:"column:remark;notNull;default:'';comment:备注"`       //备注
	Status    constant.Status `json:"status" gorm:"column:status;notNull;default:1;comment:状态"`        //状态 1启用2禁用
	CreateBy  int64           `json:"create_by" gorm:"column:create_by;notNull;default:0;comment:创建者"` //创建者
	UpdateBy  int64           `json:"update_by" gorm:"column:update_by;notNull;default:0;comment:更新者"` //最后更新者
	CreatedAt time.Time       `json:"created_at" gorm:"column:created_at;type:datetime;notNull"`
	UpdatedAt time.Time       `json:"updated_at" gorm:"column:updated_at;type:datetime;notNull"`
	DeletedAt gorm.DeletedAt  `json:"-" gorm:"column:deleted_at;index;"`

	ApiIds []int64   `json:"api_ids" gorm:"-"`                                                                                                    //绑定api。menu_type=2 时存在
	Apis   []*SysApi `json:"apis" gorm:"many2many:sys_menu_api;foreignKey:MenuId;joinForeignKey:menu_id;references:ApiId;joinReferences:api_id;"` //绑定api。menu_type=2 时存在

	Children []*SysMenu `json:"children,omitempty" gorm:"-"` //子菜单

}

func (s *SysMenu) TableName() string {
	return "sys_menu"
}

// ParseIdPath 把 IdPath 解析成数组
func (s *SysMenu) ParseIdPath(hasSelf bool) (res []int64) {
	sArr := strings.Split(s.IdPath, "/")
	for _, v := range sArr {
		if i, err := strconv.Atoi(v); err == nil && i > 0 {
			res = append(res, int64(i))
		}
	}
	if hasSelf {
		res = append(res, s.MenuId)
	}
	return
}

func (s *SysMenu) SetApiIds() {
	total := len(s.Apis)
	s.ApiIds = make([]int64, total)
	for i := 0; i < total; i++ {
		s.ApiIds[i] = s.Apis[i].ApiId
	}
}
